perm filename CNTRL.LSP[C,JRA]1 blob sn#012881 filedate 1972-11-16 generic text, type T, neo UTF8
00100	(GLOBAL
00200	 (FUNCTIONS /@  EAR TOP CINTERRUPT VFRAME CPRINT CPRIN1 PROGBIND 
00300	   RUN START STOP PROG COND GO EXIT RETURN DISMISS CEVAL CERR 
00400	   CDEFUN VLOC RVALUE CSET CSETQ TAG ACTBLOCK UNASSIGN ACCESS
00500	   CONTROL SETACCESS SETCONTROL EXPRESSION CLOSURE FRAME 
00600	   CALL BACKTRACE LISTEN CONTINUE ALLOW INVOKE
00700	   /: /, /!/> /!/' /!/? /!/; /!/" /!/@ /!/< /!/,)
00800	 (RESERVED ← *FRAME  CEXPR "OPTIONAL" "REST" "AUX"
00900	   * ** CLAMBDA *TAG *AU-REVOIR /? /< /> /' /@ /" /$ /; /  /	 /) ))
01000	
01100	(DECLARE (SPECIAL OBARRAY READTABLE ERRLIST) (SYMBOLS T) (MACROS T))
01200	
01300	(DECLARE
01400	  (SPECIAL UARGS BODY EARGS CHALOBV BVARS ALINK CLINK
01500	    EXP FRAME* FREEVARS FRAMEVARS LEVNUM PC RUNF TEM
01600	    TEM1 TYPE VAL VARS CINTERRUPT SERRLI ALLOW READY
01700	    GLOBALS * ** ←)
01800	  (*FEXPR CDEFGEN CDEFUN CERR CONNIVER CSETQ /: /@ /,)
01900	  (*LEXPR MATCH ACCESS CONTROL CSET RVALUE VLOC RUN))
02000	
02100	(SETQ  RUNF ()  SERRLI ()  ** '** GLOBALS '((NIL NIL) (T T)))(COMMENT THE FRAME FORMAT IS AS FOLLOWS
02200	   ((IVARS . PC) (BVARS . ALINK) EXP . CLINK)
02300	)
02400	
02500	(SETQ FREEVARS  '(VAL VARS UARGS BODY EARGS TEM TEM1 ALLOW)
02600	      FRAMEVARS '(CHALOBV FRAME* BVARS ALINK CLINK EXP CINTERRUPT READY))
02700	
02800	(DEFUN BVARS MACRO (L) (LIST 'CAADR (CADR L)))
02900	
03000	(DEFUN ALINK MACRO (L) (LIST 'CDADR (CADR L)))
03100	
03200	(DEFUN EXP MACRO (L) (LIST 'CADDR (CADR L)))
03300	
03400	(DEFUN CLINK MACRO (L) (LIST 'CDDDR (CADR L)))
03500	
03600	(DEFUN BODY MACRO (L) '(CADR (ASSQ '*BODY BVARS)))
     

00100	(COMMENT THE HACK REALLY BEGINS HERE -- RUN1 IS THE SYSTEM DRIVER)
00200	
00300	(DEFUN RUN L
00400	       (SETQ VAL (COND ((= L 1) (ARG 1)) (T NIL)))
00500	       (RUN1))
00600	
00700	(DEFUN RUN1 ()
00800	   (COND (RUNF (CERR CONNIVER ALREADY RUNNING))   )
00900	   ((LAMBDA (BASE IBASE READTABLE)
01000		   (PROG (RUNF ERET)
01100		     (SETQ RUNF T ERRLIST SERRLI)
01200		ERRL (SETQ ERET 
01300		       (CATCH (PROG ()
01400				LOOP (COND ((AND CINTERRUPT ALLOW)
01500					    (SETQ PC (HANDLE)))
01600					   ((SETQ PC (CAP PC))))
01700				     (GO LOOP))))
01800		     (COND ((EQ ERET 'STOP) (RETURN VAL)))
01900		     (GO ERRL)))
02000	    10.
02100	    10.
02200	    (GET 'CONNIVREAD 'ARRAY))   )
02300	
02400	(DEFUN CAP (P) (APPLY P ()))
02500	
02600	(DEFUN HANDLE () 
02700	 (PROG2 0
02800	   (DISPATCH (PROG2 0 (CAR CINTERRUPT) (SETQ CINTERRUPT (CDR CINTERRUPT)))
02900		     PC
03000		     FREEVARS
03100		     '*TOP)
03200	   (SETQ ALLOW ())))
03300	
03400	
03500	(DEFUN START NIL
03600	   (COND (RUNF (CERR CONNIVER ALREADY RUNNING)))
03700	   (MAPC '(LAMBDA (V) (SET V NIL)) (APPEND FRAMEVARS FREEVARS))
03800	   (SETQ PC 'ICEVAL EXP '(CEVAL '(LISTEN 'TOP-LEVEL)) LEVNUM 0 ALLOW T)
03900	   (RUN1)   )
04000	
04100	(DEFUN STOP N
04200	   (BREAK CONNIVER-NOT-RUNNING--STOP (NOT RUNF))
04300	   (COND ((= N 0) (SETQ VAL ()))
04400	         ((= N 1) (SETQ VAL (ARG 1)))
04500	         (T (CERR WRONG # OF ARGS)))
04600	   (SETQ PC 'POPJ)
04700	   (THROW 'STOP))
04800	
04900	(DEFUN *STOP NIL  (SETQ PC 'U-LOSE) (THROW 'STOP))
05000	
05100	(DEFUN U-LOSE NIL
05200	   (CERR ATTEMPT TO RUN A CONNIVER PROCESS WITH AN UNDEFINED PC)
05300	   'U-LOSE)
     

00100	(DEFUN CERR FEXPR (L A)
00200	   (PRINT '**ERROR**)
00300	   (MAPC '(LAMBDA (X) 
00400	             (CPRIN1 (COND ((ATOM X) X)
00500	                          ((EQ (CAR X) '/@) (EVAL (CDR X) A))
00600	                          (T X)))
00700	             (PRINC '/ ))
00800	         L)
00900	   (CPRINT EXP)
01000	   (PROG ()
01100	         (PRINT 'IN-LISP)
01200	      LP (PRINC '/*)
01400	         (ERRSET (COND ((EQ (SETQ ** (READ)) '$P)(RETURN NIL))
01500	                       ((EQ (CAR **) 'RETURN)
01600	                        (RETURN (EVAL (CADR **) A)))
01700	                       (T (SETQ * (CPRINT (EVAL ** A))))))
01800	         (SETQ ← **)
01900	         (GO LP)))
02000	
02100	(DEFUN EAR ()
02200	   (SETQ CINTERRUPT (CONS '(LISTEN 'IN-CONNIVER) CINTERRUPT)
02300	         SERRLI ERRLIST
02400	         ERRLIST '((RUN1)))
02500	   (IOC G))
02600	
02700	(DEFUN TOP ()
02800	   (SETQ SERRLI ERRLIST ERRLIST '((START)))
02900	   (IOC G))
03000	
03100	(DEFUN CINTERRUPT (EXP)
03200	   (NCONC (GET 'CINTERRUPT 'VALUE) (LIST EXP)))
03300	
03400	(DEFUN ALLOW FEXPR (L) (SETQ ALLOW (CAR L)))(COMMENT DISPATCH IS THE "PUSHJ" FOR CONNIVER)
03500	
03600	(DECLARE (SPECIAL ALINK1 EXP1 RETAG SAVE))
03700	
03800	(DEFUN DISPATCH
03900	       (EXP1 RETAG SAVE ALINK1)
04000	       (COND ((NUMBERP EXP1) (SETQ VAL EXP1) RETAG)
04100		     ((ATOM EXP1) (SETQ VAL (IVAL EXP1 ALINK1)) RETAG)
04200		     (T (PROG (V F)
04300			    (SETQ F (CAR EXP1))
04400			 BEGIN
04500			    (COND ((ATOM F)
04600				   (COND ((SETQ V
04700					      (GETL F '(CINT CEXPR FEXPR FSUBR)))
04800					   (GO (CAR V)))
04900					  (T (SAVEUP)
05000					     (SETQ UARGS (CDR EXP1) EARGS ())
05100					     (RETURN 'EVARGS))))
05200				  ((EQ (CAR F) 'CLAMBDA) 
05300				   (SAVEUP)
05400				   (BIND1 '*BODY (CDDR F))
05500				   (SETQ VARS (CADR F) UARGS (CDR EXP1))
05600				   (RETURN 'ARGB))
05700				  ((EQ (CAR F) 'LAMBDA)
05800				   (SAVEUP)
05900				   (SETQ UARGS (CDR EXP1) EARGS ())
06000				   (RETURN 'EVARGS))
06100				  ((EQ (CAR F) '*CLOSURE) 
06200				   (SETQ F (CADR F)) 
06300				   (GO BEGIN))
06400				  (T  (SETQ F (CERR UNKNOWN FUNCTION TYPE (/@ . EXP1)))
06500	                            (GO BEGIN)))
06600			 CINT
06700			    (SAVEUP)
06800			    (RETURN (CADR V))
06900		         CEXPR
07000			    (SAVEUP)
07100			    (BIND1 '*BODY (CDADR V))
07200			    (SETQ VARS (CAADR V) UARGS (CDR EXP1))
07300			    (RETURN 'ARGB)
07400		         FEXPR FSUBR
07500			    (SETQ VAL (EVAL EXP1))
07600			    (RETURN RETAG)))))
07700	
07800	
07900	(DEFUN SAVEUP () 
08000	 (SETQ
08100	   CLINK (CONS (CONS (SAVEV) RETAG)
08200	               (COND ((NULL FRAME*) (SETQ CHALOBV NIL)
08300	                      (CONS (CONS BVARS ALINK) (CONS EXP CLINK)))
08400	                     (CHALOBV (SETQ CHALOBV NIL)
08500	                      (CONS (CONS BVARS ALINK) (CDDR FRAME*)))
08600	                     (T (CDR FRAME*))))
08700	   EXP EXP1
08800	   ALINK (COND ((EQ ALINK1 '*TOP) CLINK) (T ALINK1))
08900	   BVARS NIL
09000	   FRAME* NIL))
09100	
09200	(DEFUN SAVEV () (MAPCAR '(LAMBDA (V) (CONS V (VALUE V))) SAVE))(COMMENT FUNCTION CALLS RETURN VIA "POPJ")
09300	
09400	(DEFUN POPJ ()
09500	   (COND ((SETQ FRAME* CLINK) (RESTORE))
09600	         (T '*STOP)))
09700	
09800	(DEFUN RESTORE ()
09900	 (SETQ
10000	   BVARS (CAADR FRAME*)
10100	   ALINK (CDADR FRAME*)
10200	   EXP (CADDR FRAME*)
10300	   CLINK (CDDDR FRAME*))
10400	 (REST1))
10500	
10600	(DEFUN REST1 ()
10700	 (MAPC '(LAMBDA (X) (SET (CAR X) (CDR X))) (CAAR FRAME*))
10800	 (CDAR FRAME*))
10900	
11000	(PUTPROP 'VALUE (GET 'EVAL 'LSUBR) 'LSUBR)
11100	
11200	(DECLARE (UNSPECIAL ALINK1 EXP1 RETAG SAVE))
11300	
11400	(DEFUN BIND1 (VAR VAL)
11500	   (SETQ BVARS (CONS (LIST VAR VAL) BVARS) CHALOBV T))
11600	
11700	(DEFUN CLOSE ()
11800	   (COND ((ATOM (CAR EXP)))
11900	         ((EQ (CAAR EXP) '*CLOSURE)
12000	          (SETQ ALINK (CADDAR EXP) CHALOBV T))))
     

00100	(COMMENT MOBY BINDER -- NORMAL FUNCTION LISTS)
00200	
00300	(DEFUN ARGB NIL (COND ((NOT (OR VARS UARGS)) (CLOSE) 'AUXB)
00400			      ((AND VARS UARGS)
00500			       (COND ((ATOM (CAR VARS))
00600				      (COND ((EQ (CAR VARS) '"OPTIONAL")
00700					     (SETQ VARS (CDR VARS))
00800					     (OPTMATCH))
00900					    ((EQ (CAR VARS) '"REST")
01000					     (SETQ VARS (CDR VARS))
01100					     (RESTMATCH))
01200					    (T (DISPATCH (CAR UARGS)
01300							 'ARGB1
01400							 '(VARS UARGS)
01500							 ALINK))))
01600				     ((AND (EQ (CAAR VARS) 'QUOTE)
01700					   (ATOM (CADAR VARS)))
01800				      (ARGQ))
01900				     (T (CERR BAD DECLARATION))))
02000			      ((AND VARS (OR (EQ (CAR VARS) '"OPTIONAL")
02100					     (EQ (CAR VARS) '"REST")))
02200			       (CLOSE)
02300			       (FINVAR))
02400			      (T (CERR WRONG # OF ARGS))))
02500	
02600	(DEFUN ARGB1
02700	       NIL
02800	       (BIND1 (CAR VARS) VAL)
02900	       (SETQ VARS (CDR VARS) UARGS (CDR UARGS))
03000	       'ARGB)
03100	
03200	(DEFUN ARGQ
03300	       NIL
03400	       (BIND1 (CADAR VARS) (CAR UARGS))
03500	       (SETQ VARS (CDR VARS) UARGS (CDR UARGS))
03600	       'ARGB)
     

00100	(COMMENT BIND UP "OPTIONAL"S AND "REST"S)
00200	
00300	(DEFUN OPTMATCH
00400	       NIL
00500	       (COND ((NULL UARGS) (CLOSE) (COND ((NULL VARS) 'AUXB)
00600						  (T 'FINVAR)))
00700		     ((ATOM (CAR VARS)) (COND ((EQ (CAR VARS) '"OPTIONAL")
00800					       (SETQ VARS (CDR VARS))
00900					       'OPTMATCH)
01000					      ((EQ (CAR VARS) '"REST")
01100					       (SETQ VARS (CDR VARS))
01200					       'RESTMATCH)
01300					      (T (DISPATCH (CAR UARGS)
01400							   'OPTMATCH1
01500							   '(VARS UARGS)
01600							   ALINK))))
01700		     ((EQ (CAAR VARS) 'QUOTE)
01800		      (COND ((ATOM (CADAR VARS)) (BIND1 (CADAR VARS) (CAR UARGS))
01900						 (SETQ VARS (CDR VARS) UARGS (CDR UARGS))
02000						 'OPTMATCH)
02100			    (T (CERR BAD DECLARATION))))
02200		     ((ATOM (CAAR VARS)) (DISPATCH (CAR UARGS)
02300						   'OPTMATCH1
02400						   '(VARS UARGS)
02500						   ALINK))
02600		     ((AND (EQ (CAAAR VARS) 'QUOTE) (ATOM (CADAAR VARS)))
02700		      (BIND1 (CADAAR VARS) (CAR UARGS))
02800		      (SETQ VARS (CDR VARS) UARGS (CDR UARGS))
02900		      'OPTMATCH)
03000		     (T (CERR BAD DECLARATION))))
03100	
03200	(DEFUN OPTMATCH1
03300	       NIL
03400	       (BIND1 (COND ((ATOM (CAR VARS)) (CAR VARS)) (T (CAAR VARS))) VAL)
03500	       (SETQ VARS (CDR VARS) UARGS (CDR UARGS))
03600	       'OPTMATCH)
03700	
03800	(DEFUN RESTMATCH NIL (COND ((ATOM (CAR VARS)) (SETQ EARGS NIL) (EVREST))
03900				   ((AND (EQ (CAAR VARS) 'QUOTE)
04000					 (ATOM (CADAR VARS)))
04100				    (BIND1 (CADAR VARS) UARGS)
04200				    (CLOSE) 'AUXB)
04300				   (T (CERR BAD DECLARATION))))
04400	
04500	(DEFUN EVREST NIL (COND ((NULL UARGS) 
04600				 (BIND1 (CAR VARS) (REVERSE EARGS)) 
04700				 (CLOSE) 'AUXB)
04800				(T (DISPATCH (CAR UARGS)
04900					     'EVREST1
05000					     '(VARS UARGS EARGS)
05100					     ALINK))))
05200	
05300	(DEFUN EVREST1 NIL (SETQ UARGS (CDR UARGS) EARGS (CONS VAL EARGS)) 'EVREST)
     

00100	(COMMENT WHEN RUN OUT OF ARGS BUT HAVE SOME "OPTIONAL"S OR "REST"S)
00200	
00300	(DEFUN FINVAR ()
00400	       (COND ((NULL VARS) 'AUXB)
00500		     ((ATOM (CAR VARS))
00600		      (COND ((EQ (CAR VARS) '"OPTIONAL") (SETQ VARS (CDR VARS))
00700							 'FINVAR)
00800			    ((EQ (CAR VARS) '"REST")
00900			     (SETQ VARS (CDR VARS))
01000			     (COND ((ATOM (CAR VARS)) (BIND1 (CAR VARS) NIL) 'AUXB)
01100				   ((AND (EQ (CAAR VARS) 'QUOTE)
01200					 (ATOM (CADAR VARS)))
01300				    (BIND1 (CADAR VARS) NIL)
01400				    'AUXB)
01500				   (T (CERR BAD DECLARATION))))
01600			    (T (BIND1 (CAR VARS) '*UNASSIGNED)
01700			       (SETQ VARS (CDR VARS))
01800			       'FINVAR)))
01900		     ((EQ (CAAR VARS) 'QUOTE)
02000		      (COND ((ATOM (CADAR VARS))
02100			     (BIND1 (CADAR VARS) '*UNASSIGNED)
02200			     (SETQ VARS (CDR VARS))
02300			     'FINVAR)
02400			    (T (CERR BAD DECLARATION))))
02500		     ((ATOM (CAAR VARS))
02600		      (DISPATCH (CADAR VARS) 'FINVAR1 '(VARS) '*TOP))
02700		     ((AND (EQ (CAAAR VARS) 'QUOTE) (ATOM (CADAAR VARS)))
02800		      (DISPATCH (CADAR VARS) 'FINVAR2 '(VARS) '*TOP))
02900		     (T (CERR BAD DECLARATION))))
03000	
03100	(DEFUN FINVAR1 NIL (BIND1 (CAAR VARS) VAL) (FINVAR3))
03200	
03300	(DEFUN FINVAR2 NIL (BIND1 (CADAAR VARS) VAL) (FINVAR3))
03400	
03500	(DEFUN FINVAR3 NIL (SETQ VARS (CDR VARS)) 'FINVAR)
03600	
03700	(COMMENT BINDS "AUX" VARIABLES)
03800	
03900	(DEFUN AUXB ()
04000	       (SETQ BODY (BODY))
04100	       (COND ((NULL BODY) (POPJ))
04200		     ((EQ (CAR BODY) '"AUX")
04300		      (SETQ VARS (CADR BODY))
04400		      'AUXB1)
04500		     (T 'LINE)))
04600	
04700	(DEFUN AUXB1 NIL (COND ((NULL VARS) (SETQ BODY (CDDR (BODY))) 'LINE)
04800			       ((ATOM (CAR VARS)) (BIND1 (CAR VARS) '*UNASSIGNED)
04900						  (SETQ VARS (CDR VARS))
05000						  'AUXB1)
05100			       ((AND (ATOM (CAAR VARS)) (CDAR VARS))
05200				(DISPATCH (CADAR VARS)
05300					  'AUXB2
05400					  '(VARS)
05500					  '*TOP))
05600			       (T (CERR BAD DECLARATION))))
05700	
05800	(DEFUN AUXB2 NIL (BIND1 (CAAR VARS) VAL) (SETQ VARS (CDR VARS)) 'AUXB1)
     

00100	(DEFUN CPROG NIL (BIND1 '*BODY (CDR EXP)) 'AUXB)
00200	
00300	(DEFPROP PROG CPROG CINT)
00400	
00500	(DEFUN PROGBIND () (DISPATCH (CADR EXP) 'PROGB1 NIL ALINK))
00600	
00700	(DEFUN PROGB1 ()
00800	   (BIND1 '*BODY (CONS '"AUX" (CONS (SETQ VARS VAL) (CDDR EXP)))) 
00900	   'AUXB1)
01000	
01100	(DEFPROP PROGBIND PROGBIND CINT)
01200	
01300	
01400	(COMMENT BASIC PROG ITERATION LOOP)
01500	
01600	(DEFUN LINE ()
01700	       (COND ((NULL BODY) (POPJ))
01800		     (T (DISPATCH (CAR BODY) 'LINE1 '(BODY) '*TOP))))
01900	
02000	(DEFUN LINE1 NIL (SETQ BODY (CDR BODY)) 'LINE)
02100	
02200	
02300	(COMMENT EVALUATES ARGUMENTS TO LISP EXPRS SUBRS AND LSUBRS)
02400	
02500	(DEFUN EVARGS ()
02600		(COND ((NULL UARGS)
02700		       (SETQ VAL (APPLY (CAR EXP) (REVERSE EARGS)))
02800		       (POPJ))
02900		      (T (DISPATCH (CAR UARGS) 'ARGS1 '(UARGS EARGS) ALINK))))
03000	
03100	(DEFUN ARGS1 ()
03200	   (SETQ UARGS (CDR UARGS) EARGS (CONS VAL EARGS)) 'EVARGS)
     

00100	(COMMENT LOGICAL FLOW OF CONTROL FUNCTIONS)
00200	
00300	(DEFUN CCOND () (SETQ UARGS (CDR EXP)) (CONDLP))
00400	
00500	(DEFUN CONDLP ()
00600	       (COND ((NULL UARGS) (POPJ))
00700		     (T (DISPATCH (CAAR UARGS) 'COND1 '(UARGS) ALINK))))
00800	
00900	(DEFUN COND1 NIL (COND (VAL (BIND1 '*BODY (CDAR UARGS)) 'AUXB)
01000			       (T (SETQ UARGS (CDR UARGS)) 'CONDLP)))
01100	
01200	(DEFPROP COND CCOND CINT)
01300	
01400	
01500	(DEFUN IAND ()
01600	    (COND ((NULL (SETQ EXP (CDR EXP))) (OR VAL (SETQ VAL T)) (POPJ))
01700	          ((DISPATCH (CAR EXP) 'IAND1 '(EXP) '*TOP))   ))
01800	
01900	(DEFUN IAND1 ()
02000	   (COND (VAL 'IAND)
02100	         ('POPJ)   ))
02200	
02300	(DEFPROP AND IAND CINT)
02400	
02500	
02600	(DEFUN IOR ()
02700	   (COND ((NULL (SETQ EXP (CDR EXP))) (SETQ VAL NIL) (POPJ))
02800	         ((DISPATCH (CAR EXP) 'IOR1 '(EXP) '*TOP))   ))
02900	
03000	(DEFUN IOR1 ()
03100	   (COND (VAL (POPJ))
03200	         (T 'IOR)   ))
03300	
03400	(DEFPROP OR IOR CINT)
     

00100	(COMMENT USERS OF FRAMES -- FLOW OF CONTROL CONTROLLERS)
00200	
00300	(DEFUN CGO NIL (DISPATCH (CADR EXP) 'GO1 NIL ALINK))
00400	
00500	(DEFUN GO1 ()
00600	  (COND ((ATOM VAL)
00700	         (PROG (FR TAG B)
00800	               (SETQ FR ALINK TAG '(/: FOO))
00900	               (RPLACA (CDR TAG) VAL)
01000	            LP (COND ((NULL FR) (SETQ VAL (CERR TAG NOT FOUND)) 'GO1)
01100	                     ((SETQ B (ASSQ '*BODY (BVARS FR)))
01200	                      (COND ((SETQ B (MEMBER TAG (CADR B)))
01300	                             (SETQ FRAME* FR)
01400	                             (RESTORE)
01500	                             (SETQ BODY B)
01600	                             (RETURN 'LINE)))))
01700	               (SETQ FR (CLINK FR))
01800	               (GO LP)))
01900	         ((EQ (CAR VAL) '*TAG)
02000	          (SETQ FRAME* (CADDR VAL))
02100	          (RESTORE))
02200	         (T (SETQ VAL (CERR BAD TAG)) 'GO1)))
02300	
02400	(DEFPROP GO CGO CINT)
02500	
02600	(DEFUN CEXIT NIL (DISPATCH (CADR EXP) 'EXIT1 () ALINK))
02700	
02800	(DEFUN EXIT1 ()
02900	       (SETQ TEM VAL)
03000	       (COND ((CDDR EXP)
03100		      (DISPATCH (CADDR EXP) 'EXIT2 '(TEM) ALINK))
03200		     (T (PROG (FR)
03300	                      (SETQ FR ALINK)
03400	                   LP (COND ((NULL FR) (CERR EXIT FROM WHAT?))
03500	                            ((ASSQ '*BODY (BVARS FR))
03600	                             (SETQ CLINK (CLINK FR)) 
03700	                             (RETURN (POPJ))))
03800	                      (SETQ FR (CLINK FR))
03900	                      (GO LP)))))
04000	
04100	(DEFUN EXIT2 ()
04200	   (SETQ CLINK (CLINK (FR VAL)) VAL TEM)
04300	   (POPJ))
04400	
04500	(DEFPROP EXIT CEXIT CINT)
04600	
04700	(DEFUN CRETURN NIL (DISPATCH (CADR EXP) 'RETURN1 NIL ALINK))
04800	
04900	(DEFUN RETURN1 NIL (PROG (FR)
05000				 (SETQ FR ALINK)
05100			    LP	 (COND ((NULL FR) (CERR RETURN FROM WHAT?))
05200				       ((AND (ASSQ '*BODY (BVARS FR))
05300					     (NOT (EQ (CAR (EXP FR)) 'COND)))
05400					(SETQ CLINK (CLINK FR))
05500					(RETURN (POPJ))))
05600				 (SETQ FR (CLINK FR))
05700				 (GO LP)))
05800	
05900	(DEFPROP RETURN CRETURN CINT)(DEFUN CDISMISS NIL (COND ((CDR EXP)
06000				   (SETQ TEM ())
06100				   (DISPATCH (CADR EXP) 'EXIT2 '(TEM) ALINK))
06200				 (T (SETQ VAL ()) (RETURN1))))
06300	
06400	(DEFPROP DISMISS CDISMISS CINT)
06500	
06600	(DEFUN CONTINUE () (DISPATCH (CADR EXP) 'CONT1 () ALINK))
06700	
06800	(DEFUN CONT1 ()
06900	      (SETQ TEM VAL)
07000	      (COND ((CDDR EXP) (DISPATCH (CADDR EXP) 'CONT2 '(TEM) ALINK))
07100	            (T (SETQ VAL () FRAME* (FR TEM)) (RESTORE))))
07200	
07300	(DEFUN CONT2 () (SETQ FRAME* (FR TEM)) (RESTORE))
07400	
07500	(DEFPROP CONTINUE CONTINUE CINT)(COMMENT RELATIVE EVALUATORS)
07600	
07700	(DEFUN ICEVAL NIL (DISPATCH (CADR EXP) 'CEVAL1 () ALINK))
07800	
07900	(DEFUN CEVAL1 ()
08000	       (SETQ TEM1 VAL)
08100	       (COND ((CDDR EXP)
08200		      (DISPATCH (CADDR EXP) 'CEVAL2 '(TEM1) ALINK))
08300		     (T (SETQ VAL (FRAME)) 'CEVAL2)))
08400	
08500	(DEFUN CEVAL2 ()
08600	   (DISPATCH TEM1 'POPJ NIL (FR VAL)))
08700	
08800	(DEFPROP CEVAL ICEVAL CINT)
08900	
09000	(DEFUN ICALL NIL (DISPATCH (CADR EXP) 'CALL1 NIL ALINK))
09100	
09200	(DEFUN CALL1 () (DISPATCH (CONS VAL (CDDR EXP)) 'POPJ NIL ALINK))
09300	
09400	(DEFPROP CALL ICALL CINT)
09500	
09600	(DEFUN INVOKE () (DISPATCH (CADR EXP) 'TRY1 () ALINK))
09700	
09800	(DEFUN TRY1 () (SETQ TEM VAL) (DISPATCH (CADDR EXP) 'TRY2 '(TEM) ALINK))
09900	
10000	(DEFUN TRY2 ()
10100	   (SETQ EXP (LIST TEM VAL) FRAME* NIL)
10200	   (PROG (AL METHPAT)
10300	      (COND ((NULL (SETQ AL (MATCH (SETQ METHPAT (PATTERN TEM)) VAL)))
10400	             (RETURN (POPJ)))
10500	            (T (SETQ BVARS (NCONC (LIST (LIST '*CALLPAT VAL)
10600	                                        (LIST '*METHPAT METHPAT)
10700	                                        (LIST '*CALLALIST (CADR AL))
10800	                                        (LIST '*BODY (TEXT TEM)))
10900	                                  (CAR AL)))
11000	               (CLOSE)
11100	               (RETURN 'AUXB)))))
11200	
11300	(DEFPROP INVOKE INVOKE CINT)
11400	
11500	(DEFUN TEXT (METH)
11600	   (COND ((ATOM METH) (TEXT (GET METH 'DATUM)))
11700	         ((EQ (CAR METH) '*CLOSURE) (TEXT (CADR METH)))
11800	         (T (CADDDR METH))))
11900	
12000	(DEFUN FR (E)
12100	     (COND ((EQ (CAR E) '*FRAME) (CADR E))
12200	           ((EQ (CAR E) '*TAG) (CADDR E))
12300	           ((EQ (CAR E) '*CLOSURE) (CADDR E))
12400	           ((EQ (CAR E) '*AU-REVOIR) (CADR E))
12500	           (T (CERR BAD FRAME SUPPLIED))))(COMMENT IDENTIFIER MANIPULATORS)
12600	
12700	(DEFUN VFRAME N
12800	  (PROG (FR LOC)
12900	        (SETQ FR (COND ((= N 1) ALINK) 
13000	                       ((= N 2) (FR (ARG 2))) 
13100	                       (T (CERR WRONG # OF ARGS))))
13200	     LP (COND ((NULL FR) (RETURN NIL))
13300	              ((SETQ LOC (ASSQ (ARG 1) (BVARS FR)))
13400	               (RETURN (LIST '*FRAME (CHAUX FR) LOC))))
13500	        (SETQ FR (ALINK FR))
13600	        (GO LP)))
13700	
13800	(DEFUN VLOC N (PROG (FR LOC)
13900			    (SETQ FR (COND ((= N 1.) 
14000	                                    (COND ((SETQ LOC (ASSQ (ARG 1) 
14100								   BVARS))
14200	                                         (RETURN LOC)))
14300	                                    ALINK)
14400	                                   ((= N 2.) (FR (ARG 2.)))
14500	                                   (T (CERR WRONG # OF ARGS))))
14600		       LP   (COND ((NULL FR) (RETURN (ASSQ (ARG 1) GLOBALS)))
14700				  ((SETQ LOC (ASSQ (ARG 1.) (BVARS FR)))
14800				    (RETURN LOC)))
14900			    (SETQ FR (ALINK FR))
15000			    (GO LP)))
15100	
15200	(DEFUN RVALUE N 
15300	   ((LAMBDA (LOC) 
15400	      (COND (LOC (COND ((CDDR LOC) (APPLY (CADDR LOC) (LIST 'RVALUE LOC))))
15500	             (CADR LOC))
15600	            (T (CERR UNBOUND VARIABLE @(ARG 1)))))
15700	     (COND ((= N 1.) (VLOC (ARG 1.)))
15800	           ((= N 2.) (VLOC (ARG 1.) (ARG 2.)))
15900	           (T (CERR WRONG # OF ARGS)))))
16000	
16100	(DECLARE (SPECIAL ID))
16200	
16300	(DEFUN IVAL (ID FR)
16400	   (PROG (ANS)
16500	         (COND ((EQ FR '*TOP)
16600	                (COND ((SETQ ANS (ASSQ ID BVARS))
16700	                       (GO FOUND))
16800	                      (T (SETQ FR ALINK)))))
16900	      LP (COND ((NULL FR)
17000	                 (COND ((SETQ ANS (ASSQ ID GLOBALS)) (GO FOUND))
17100	                       (T (RETURN (CERR UNBOUND VARIABLE (/@ . ID))))))
17200	                ((SETQ ANS (ASSQ ID (BVARS FR))) (GO FOUND)))
17300	         (SETQ FR (ALINK FR))
17400	         (GO LP)
17500	     FOUND
17600	         (COND ((CDDR ANS) (APPLY (CADDR ANS) (LIST '/, ANS))))
17700	         (COND ((EQ (SETQ ANS (CADR ANS)) '*UNASSIGNED)
17800	                (RETURN (CERR UNASSIGNED VARIABLE (/@ . ID)))))
17900	         (RETURN ANS)))
18000	
18100	(DECLARE (UNSPECIAL ID))
     

00100	(DEFUN ICSETQ () (SETQ UARGS EXP)(CSETQ0))
00200	
00300	(DEFUN CSETQ0 () 
00400	   (COND ((CDR UARGS)
00500		  (COND ((AND (ATOM (CADR UARGS)) (CDDR UARGS))
00600			 (DISPATCH (CADDR UARGS) 'CSETQ1 '(UARGS) ALINK))
00700			(T (CERR BAD CALL) (POPJ))))
00800		 (T (POPJ))))
00900	
01000	(DEFUN CSETQ1 () 
01100	   ((LAMBDA (LOC)
01200	       (COND (LOC (COND ((CDDR LOC) (APPLY (CADDR LOC) (LIST 'CSET LOC VAL))))
01300	              (RPLACA (CDR LOC) VAL))
01400	             (T (SETQ GLOBALS (CONS (LIST (CADR UARGS) VAL) GLOBALS)))))
01500	    (VLOC (CADR UARGS)))
01600	   (SETQ UARGS (CDDR UARGS))
01700	   'CSETQ0)
01800	
01900	(DEFUN CSETQ FEXPR (L)
02000	   (CSET (CAR L) (EVAL (CADR L)))   )
02100	
02200	(DEFPROP CSETQ ICSETQ CINT)
02300	
02400	(DEFUN CSET N
02500	  ((LAMBDA (LOC)
02600	      (COND (LOC (COND ((CDDR LOC) (APPLY (CADDR LOC) (LIST 'CSET LOC (ARG 2)))))
02700	             (RPLACA (CDR LOC) (ARG 2.)))
02800	            (T (SETQ GLOBALS (CONS (LIST (ARG 1) (ARG 2)) GLOBALS))))
02900	    (ARG 2.))
03000	   (COND ((= N 2.) (VLOC (ARG 1.)))
03100	         ((= N 3.) (VLOC (ARG 1.) (ARG 3.)))
03200	         (T (CERR WRONG # OF ARGS)))))
03300	
03400	(DEFUN UNASSIGN (VAR) (CSET VAR '*UNASSIGNED))(COMMENT FRAME CONSTRUCTORS)
03500	
03600	(DEFUN CHAUX (FR)
03700	   (COND ((NULL FR) NIL)
03800	         ((EQ (CDAR FR) 'AUXB1)
03900	          (CERR ATTEMPT TO RETURN INCOMPLETE FRAME))
04000	         (T FR)))
04100	
04200	(DEFUN TAG (NAME)
04300	   (PROG (FR B TAG)
04400	         (SETQ FR ALINK TAG '(/: FOO))
04500	         (RPLACA (CDR TAG) NAME)
04600	      LP (COND ((NULL FR) (RETURN NIL))
04700	               ((SETQ B (ASSQ '*BODY (BVARS FR)))
04800	                (COND ((SETQ B (MEMBER TAG (CADR B)))
04900	                       (CHAUX FR)
05000	                       (RETURN (LIST '*TAG NAME
05100	                                  (CONS (CONS (LIST (CONS 'BODY B))
05200	                                              'LINE)
05300	                                        (CDR FR))))))))
05400	         (SETQ FR (CLINK FR))
05500	         (GO LP)))
05600	
05700	(DEFUN ACTBLOCK ()
05800	   (PROG (FR B)
05900	         (SETQ FR ALINK)
06000	     LP  (COND ((NULL FR) (RETURN ()))
06100	               ((SETQ B (ASSQ '*BODY (BVARS FR)))
06200	                (CHAUX FR)
06300	                (COND ((EQ (CAR B) '"AUX") (SETQ B (CDDR B))))
06400	                (RETURN (LIST '*TAG '*ACTBLOCK
06500	                              (CONS (CONS (LIST (CONS 'BODY B)) 'LINE)
06600	                                    (CDR FR))))))
06700	         (SETQ FR (CLINK FR))
06800	         (GO LP)))
06900	
07000	(DEFUN ACCESS N
07100	   (LIST '*FRAME
07200	     (CHAUX (COND ((= N 0.) (ALINK ALINK))
07300	                  ((= N 1.) (ALINK (FR (ARG 1.))))
07400	                  (T (CERR WRONG # OF ARGS))))))
07500	
07600	(DEFUN CONTROL N 
07700	   (LIST '*FRAME
07800	     (CHAUX (COND ((= N 0.) (CLINK ALINK))
07900	                  ((= N 1.) (CLINK (FR (ARG 1))))
08000	                  (T (CERR WRONG # OF ARGS))))))
08100	
08200	(DEFUN CLOSURE N
08300	   (COND ((OR (< N 1) (> N 2)) (CERR WRONG # OF ARGS))   )
08400	   (LIST '*CLOSURE (ARG 1) (CHAUX (COND ((= N 2) (FR (ARG 2)))
08500	                                        (T ALINK))   ))   )
08600	
08700	(DEFUN FRAME NIL (LIST '*FRAME (CHAUX ALINK)))(COMMENT VERY DANGEROUS USER (HA!) FUNCTIONS)
08800	
08900	(DEFUN SETACCESS (T1 S) 
09000	   (SETQ T1 (FR T1) S (FR S))
09100	   (RPLACD (CADR T1) S)
09200	   'BOOM!)
09300	
09400	(DEFUN SETCONTROL (T1 S)
09500	   (SETQ T1 (FR T1) S (FR S))
09600	   (RPLACD (CDDR T1) S)
09700	   'BOOM!)
09800	
09900	(DEFUN CEVAL N 
10000	   ((LAMBDA (PC EXP ALINK)
10100	      (PROG (CLINK FRAME* BVARS CHALOBV RUNF) (RETURN (RUN1))))
10200	    'ICEVAL
10300	    (LIST 'CEVAL (LIST 'QUOTE (ARG 1)))
10400	    (COND ((> N 1) (FR (ARG 2))) (T ALINK))))(COMMENT DEBUGGING AIDS)
10500	
10600	(DEFUN EXPRESSION (F) (EXP (FR F)))
10700	
10800	(DEFUN BACKTRACE N (PROG (FR E B M TEM)
10900				 (SETQ FR (FRAME))
11000				 (COND ((= N 0.) (SETQ M 262143.))
11100				       (T (SETQ M (ARG 1.))))
11200				 (COND ((= N 2.) (SETQ TEM (ARG 2.))))
11300			    LP	 (COND ((OR (NULL (CADR FR)) (= M 0.))
11400					(RETURN 'END-OF-BACKTRACE)))
11500				 (SETQ E (EXPRESSION FR))
11600				 (COND ((SETQ B (GET (CAR E) 'BACKTRACE))
11700					(APPLY B (LIST FR (CDR E))))
11800				       (T (CPRINT E)))
11900				 (COND (TEM (CPRIN1 (CAADR FR))))
12000				 (SETQ FR (CONTROL FR))
12100				 (SETQ M (/1- M))
12200				 (GO LP)))
12300	
12400	(DEFUN LISTENB
12500	       (FR ARG)
12600	       (PRINT (IVAL 'EAR (CADR FR)))
12700	       (CPRIN1 (IVAL 'MESSAGE (CADR FR)))
12800	       (PRINC '/ ))
12900	
13000	(DEFPROP LISTEN LISTENB BACKTRACE)
13100	
13200	(DEFUN CONDB (FR ARG) (PRINT 'COND))
13300	
13400	(DEFPROP COND CONDB BACKTRACE)
13500	
13600	(DEFUN PROGB (FR ARG) (PRINT 'PROG))
13700	
13800	(DEFPROP PROG PROGB BACKTRACE)
13900	
14000	(DEFUN CEVALB (FR ARG) (COND (TEM (PRINT 'CEVAL))))
14100	
14200	(DEFPROP CEVAL CEVALB BACKTRACE)
14300	
14400	(DEFUN UPDATEB (FR ARG) ())
14500	
14600	(DEFPROP UPDATE UPDATEB BACKTRACE)
14700	
14800	(DEFUN SETB (FR ARG)
14900	   (OR (MEMBER (CAR ARG) '('* '**))
15000	       (PRINT (CONS 'SET ARG))))
15100	
15200	(DEFPROP SET SETB BACKTRACE)
15300	
15400	(DEFUN PROGBINDB (FR ARG) (PRINT 'PROGBIND))
15500	
15600	(DEFPROP PROGBIND PROGBINDB BACKTRACE)
     

00100	(COMMENT USER INTERFACE)
00200	
00300	(DEFUN CDEFUN FEXPR (L) (PUTPROP (CAR L) (CDR L) 'CEXPR) (CAR L))
00400	
00500	(CDEFUN LISTEN (MESSAGE) "AUX"((EAR (GENLEV)))
00600	   (ALLOW T)
00700	   (CPRINT MESSAGE)
00800	   (PROGBIND (LIST EAR 'LOOP)
00900	       (CSET EAR (TAG 'EAR))
01000	       (CSETQ LOOP (TAG 'LOOP))
01100	     (/: EAR)
01200	       (PRINT EAR)
01300	     (/: LOOP)
01400	       (SETQ ← **)
01500	       (/@ PRINT '/←)
01700	       (SET '* (CEVAL (SETQ ** (READ))))
01800	       (/@ CPRINT *)
01900	       (GO LOOP)))
02000	
02100	(DEFUN GENLEV NIL (READLIST (APPEND '(E A R -)
02200					    (EXPLODE (SETQ LEVNUM (ADD1 LEVNUM))))))
02300	
02400	(DEFUN /: FEXPR (L) L)
02500	
02600	(DEFUN /@ FEXPR (\L) (EVAL \L))
02700	
02800	(DEFUN /, FEXPR (L) (IVAL (CAR L) '*TOP))
     

00100	(DEFUN CPRIN1 (X)
00200	   (PROG (Y)
00300	         (COND ((ATOM X) (PRIN1 X) (RETURN X))
00400	               ((AND (ATOM (CAR X)) (SETQ Y (GET (CAR X) 'CPRINT)))
00500	                (APPLY Y X) (RETURN X)))
00600	         (SETQ Y X)
00700	         (PRINC '/()
00800	       PLOOP
00900	         (CPRIN1 (CAR Y))
01000	         (COND ((NULL (SETQ Y (CDR Y))) (PRINC '/)) (RETURN X))
01100	               ((ATOM Y) (PRINC '/ /./ ) (PRIN1 Y) (PRINC '/)) (RETURN X)))
01200	         (PRINC '/ )
01300	         (GO PLOOP)))
01400	
01500	(DEFUN CPRINT (X) (PRINC '//
01600	) (CPRIN1 X) (PRINC '/ ) X)
01700	
01800	(DEFUN CP-MACR FEXPR (E) (PRINC (CAR E)) (PRIN1 (CADR E)))
01900	(DEFPROP /: CP-MACR CPRINT)
02000	(DEFPROP /, CP-MACR CPRINT)
02100	
02200	(DEFUN CP-QUOTE FEXPR (E) (PRINC '/') (CPRIN1 (CADR E)))
02300	(DEFPROP QUOTE CP-QUOTE CPRINT)
02400	
02500	(DEFUN CP-*TAG FEXPR (TAG)
02600	  (PRINC '/()
02700	  (PRIN1 (CAR TAG))
02800	  (PRINC '/ )
02900	  (CPRIN1 (CADR TAG))
03000	  (PRINC '/ )
03100	  (CPRIN1 (EXP (CADDR TAG)))
03200	  (PRINC '/)))
03300	(DEFPROP *TAG CP-*TAG CPRINT)
03400	(DEFPROP *CLOSURE CP-*TAG CPRINT)
03500	
03600	(DEFUN CP-*FRAME FEXPR (FRAME)
03700	  (PRINC '/() 
03800	  (PRIN1 (CAR FRAME)) 
03900	  (PRINC '/ )
04000	  (CPRIN1 (EXP (CADR FRAME)))
04100	  (PRINC '/)))
04200	(DEFPROP *FRAME CP-*FRAME CPRINT)
04300	(DEFPROP *AU-REVOIR CP-*FRAME CPRINT)
04400	
04500	(DEFUN CP-MATCH FEXPR (E)
04600	   (PRINC (CAR E))
04700	   (COND ((CDDR E) (CPRIN1 (CDR E)))
04800	         ((CADR E) (CPRIN1 (CADR E))   )))
04900	
05000	(DEFPROP /!/> CP-MATCH CPRINT)
05100	(DEFPROP /!/' CP-MATCH CPRINT)
05200	(DEFPROP /!/? CP-MATCH CPRINT)
05300	(DEFPROP /!/; CP-MATCH CPRINT)
05400	(DEFPROP /!/< CP-MATCH CPRINT)
05500	(DEFPROP /!/, CP-MATCH CPRINT)
05600	(DEFPROP /!/@ CP-MATCH CPRINT)
05700	
05800	(DEFUN CP-/!/" FEXPR (E) (PRINC (CAR E)) (CPRIN1 (CDR E)))
05900	(DEFPROP /!/" CP-/!/" CPRINT)
06000	(DEFPROP /@ CP-/!/" CPRINT)(DEFUN COLMAC NIL (LIST '/: (READ)))
06100	
06200	(DEFUN COMMAC () (LIST '/, (READ)))
06300	
06400	(DEFUN ATMAC () (CONS '/@ (READ)))
06500	
06600	(DEFUN EXMAC ()
06700	  (PROG (C F)
06800	    (SETQ C (NXTCHR))
06900	    (COND ((EQ C '/$) (TYI) 
07000	           (RETURN ((LAMBDA (OBARRAY) (READ))
07100			    (GET 'CONNIVER 'ARRAY))))
07200	          ((EQ C '/") (TYI) (RETURN (CONS '/!" (READ))))
07300	          ((SETQ F (ASSQ C '((/? /!/?) (/' /!/') (/@ /!/@) (/> /!/>)
07400	                             (/, /!/,) (/< /!/<) (/; /!/;))))
07500	           (TYI)
07600	           (SETQ F (CADR F)))
07700	          (T (PRINT (LIST 'BAD '/! 'MACRO C)) (IOC G)))
07800	    (RETURN (COND ((SEPARATOR (NXTCHR)) (LIST F NIL))
07900	                  ((ATOM (SETQ C (READ))) (LIST F C))
08000	                  (T (CONS F C))))))
08100	
08200	(DEFUN NXTCHR () (ASCII (TYIPEEK)))
08300	
08400	(DEFUN SEPARATOR (CHAR) (MEMQ CHAR '(/  /	 /) )))
08500	
08600	(MAKREADTABLE 'CONNIVREAD)
08700	
08800	((LAMBDA (READTABLE)
08900	       (SSTATUS MACRO /: 'COLMAC)
09000	       (SSTATUS MACRO /, 'COMMAC)
09100	       (SSTATUS MACRO /@ 'ATMAC)
09200	       (SSTATUS MACRO /! 'EXMAC))
09300	 (GET 'CONNIVREAD 'ARRAY))
09400